home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / simulato / v2_3_mc6.tz / v2_3_mc6 / testfiles / samples.asm < prev    next >
Assembly Source File  |  1994-05-02  |  6KB  |  185 lines

  1. ;Routines
  2. ;
  3. ;============================================================================
  4. ;                    I M P O R T A N T!!!
  5. ; These routines 'obey' the convention that 'proper' subroutines
  6. ; may freely modify registers d0,d1,a0, and a1.  All other registers
  7. ; must be preserved.
  8. ;
  9. ; Since most of these subroutines call the kernal, you cannot tell directly
  10. ; which registers these subroutines modify.  SO IT IS IN YOUR BEST INTEREST
  11. ; TO OBEY THE ABOVE CONVENTION.  In other words, don't depend on something
  12. ; you put in A0,A1,D0,D1 to be there after you call one of these routines.
  13. ;
  14. ; Also, labels like 1$, 2$ etc. are local labels.  They take the form  nnn$
  15. ; and are only valid between properly named lables.  This means that if you
  16. ; use these subroutines, you only have to worry about what the NAMES of the
  17. ; subroutines are.  You do NOT have to worry about all the branches.  Also
  18. ; note that the source code is harder to understand without properly named
  19. ; labels, so it is suggested they not be used in your program.
  20. ;
  21. ; WARNING: Labels are CASE SENSITIVE, JSR READCHAR is not JSR ReadChar
  22. ;
  23. ;============================================================================
  24.  
  25. ; equates for kernel routines
  26.  
  27. INCHE   equ     247
  28. OUTCH   equ     248
  29. OUTPUT  equ     243
  30.  
  31.  
  32.  
  33.  
  34. ;===========================================================================
  35. ;
  36. ; ReadChar - will read in a character from the keyboard and put it in the
  37. ;           low-byte of d0.  This routine will not return until a character
  38. ;           has been entered.
  39. ;           USAGE : JSR ReadChar
  40. ;
  41.  
  42. ReadChar    move.l  d7,-(sp)            ; save d7
  43.             move    #INCHE,d7
  44.             trap    #14
  45.             move.l  (sp)+,d7            ; restore d7
  46.             rts
  47.  
  48.  
  49.  
  50. ;============================================================================
  51. ;
  52. ; WriteString - given the starting address of a string in A0, this routine
  53. ;               will write the string to the screen.  The string must be
  54. ;               terminated by a null byte ($00).
  55. ;               USAGE : JSR WriteString
  56. ;                Given : 1. A0 = Address of first character in string
  57. ;                        2. Last character in string is $00 or NULL
  58. ;
  59. ;
  60.  
  61. WriteString movem.l a0-a6/d0-d7,-(sp) ; save registers
  62.             move.l  a0,a1             ; a0 is overwritten when OUTPUT is called
  63.                                       ;  so keep track of location within the
  64.                                       ;  string using a1
  65.             movea.l a0,a5
  66.             movea.l a0,a6
  67.             move    #OUTPUT,d7         
  68. 1$          adda.l  #1,a6
  69.             move.b  (a1)+,d0          ; get a byte
  70.             tst.b   d0                ; check for null
  71.             beq     2$   
  72.             bra     1$
  73. 2$          trap    #14               ; print it
  74.             movem.l  (sp)+,d7-d0/a6-a0 ; restore registers
  75.             rts
  76.  
  77.  
  78. ;===========================================================================
  79. ;
  80. ; ClearScreen - Clears the screen of the terminal
  81. ;               USAGE : JSR ClearScreen
  82. ;
  83.  
  84. ClearScreen move.b   #$1A,d0
  85.             jsr WriteChar
  86.             rts
  87.  
  88.  
  89. ;==========================================================================
  90. ;WriteEOL - This character writes an EOL (End of Line) to the screen.
  91. ;           I.E. So the next string written to the screen doesn't go
  92. ;           on the end of the last one you've written.
  93. ;           USAGE : JSR WriteEOL
  94.  
  95. WriteEOL    move.l d7,-(sp)
  96.             move #OUTCH,d7
  97.             move #13,d0
  98.             trap #14
  99.             move #10,d0
  100.             trap #14
  101.             move.l (sp)+,d7
  102.             rts
  103.  
  104.  
  105.  
  106. ;===========================================================================
  107. ;   WriteChar - will write a single character contained in the low byte
  108. ;               of d0 to the screen
  109. ;
  110.  
  111. WriteChar   move.l    d7,-(sp)       ;save d7
  112.             move      #OUTCH,d7
  113.             trap      #14
  114.             move.l    (sp)+,d7       ;restore d7
  115.             rts
  116.  
  117.  
  118. ;===========================================================================
  119. ;
  120. ; Malloc - (short for Memory ALLOCate) call with register d0 (long)
  121. ;          holding the size of the memory block requested.  A pointer
  122. ;          to a block of memory will be returned in register A0.  The
  123. ;          start address of the memory block will always be on a word 
  124. ;          boundary.  The memory 'heap' that Malloc uses is from
  125. ;          $5000 to $5FFF.  If a Malloc cannot handle a request (lack
  126. ;          of available memory), it will print an error message and
  127. ;          terminate the process.
  128. ;
  129.  
  130. malloc
  131.             move.l  1$,a0               ; address of the top of the 'heap'
  132.             move.l  a0,d1
  133.             add.l   d0,d1               ; add req. size to top
  134.             btst    #0,d1               ; check if result is odd
  135.             beq.s   2$
  136.             addq    #1,d1               ; make new top an even address
  137. 2$          cmp.l   #$6000,d1
  138.             bgt.s   3$                  ; abort if top > $6000
  139.             move.l  d1,1$               ; save new top
  140.             rts
  141.  
  142. ; abort
  143.  
  144. 3$          lea     4$,a0
  145.             jsr     WriteString
  146.             move    #228,d7
  147.             trap    #14
  148.  
  149.  
  150. 1$          dc.l    $5000               ; address of the top of the heap
  151.  
  152. 4$          dc.b    13,10,'NO MEMORY AVAILABLE FOR MALLOC',13,10,0
  153.             cnop    0,2
  154.  
  155. ;===========================================================================
  156. ;
  157. ; ReadString - will read in a string from the keyboard and put it in 
  158. ;           memory pointed to by a0.  This routine will not return until
  159. ;           a carriage return has been entered.  A null byte will be moved 
  160. ;           to the end of your string.  
  161. ;
  162.  
  163. ReadString  move.l  d7,-(sp)            ; save d7
  164.             movea.l a0,a1
  165.             move    #INCHE,d7
  166. 2$          trap    #14
  167.  
  168.             jsr WriteChar               ;echo the character
  169.                
  170.             cmp.b   #13,d0
  171.             beq 1$
  172.             cmp.b   #8,d0               ;compare to backspace
  173.             beq 3$
  174.             move.b  d0,(a1)+
  175.             bra 2$
  176. 1$          move.b  #0,(a1)+            ;move the null to memory
  177.             move.l  (sp)+,d7            ; restore d7
  178.             rts
  179. 3$          suba.l  #1,a1
  180.             bra 2$
  181.  
  182.  
  183. 
  184.  
  185.